﻿using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;

namespace TESTCOM
{
    public static class toolsCOM
    {

       static SerialPort myPort;

        /// <summary>
        /// 初始化端口
        /// 这里使用默认的1号端口，速率9600bts,无奇偶校验
        /// </summary>
        public static void InitSerialPort()
        {
            // 端口初始化
            myPort = new SerialPort();
            myPort.PortName = "COM3";
            myPort.BaudRate = 9600;
            myPort.Parity = Parity.None;
            myPort.DataBits = 8;
            myPort.StopBits = StopBits.One;
            
            myPort.WriteTimeout = 2000;
            if (!myPort.IsOpen)
            {
                try
                {
                    // 打开端口
                    myPort.Open();
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show("端口打开失败，请关闭软件后重新打开");
                }

            }
        }

        public static void closeCmd()
        {
            if (myPort != null && myPort.IsOpen) {
                myPort.Close();
            }           
        }

        /// <summary>
        ///  发送指令
        ///  指令根据目标平台组成
        /// </summary>
        /// <param name="strCmd"></param>
        public static void SendCmd(string strCmd)
        {
            if (myPort == null)
            {
                InitSerialPort();
            }
            try
            {
                //var byss = StringToHexByte(strCmd, Encoding.UTF8);
                //var byss = Hex16StringToHex16Byte(strCmd);
                var ss = StringToHex16String(strCmd);
                myPort.Write(strCmd);
                if (myPort.BytesToRead > 0) {
                    Console.WriteLine("abababs");
                    byte[] data = new byte[myPort.BytesToRead];
                    myPort.Read(data, 0, data.Length);
                    string rs = Encoding.ASCII.GetString(data);
                    Console.WriteLine(rs);
                }
                
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
        }




        public static byte[] StringToHexByte(string s, Encoding encode)
        {
            byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
            string result = string.Empty;
            byte[] bb = new byte[5];
            for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符，以%隔开
            {
                result += " " + Convert.ToString(b[i], 16);
                bb[i] = Convert.ToByte(Convert.ToString(b[i], 16));
            }
            return bb;
        }

        /// <summary>
        /// 此方法用于将16进制的字符串转换成16进制的字节数组
        /// </summary>
        /// <param name="_hex16ToString">要转换的16进制的字符串。</param>
        public static byte[] Hex16StringToHex16Byte(string _hex16String)
        {
            //去掉字符串中的空格。
            _hex16String = _hex16String.Replace(" ", "");
            if (_hex16String.Length / 2 == 0)
            {
                _hex16String += " ";
            }
            //声明一个字节数组，其长度等于字符串长度的一半。
            byte[] buffer = new byte[_hex16String.Length / 2];
            for (int i = 0; i < buffer.Length; i++)
            {
                //为字节数组的元素赋值。
                buffer[i] = Convert.ToByte((_hex16String.Substring(i * 2, 2)), 16);
            }
            //返回字节数组。
            return buffer;
        }

        /// <summary>
        /// 此方法用于将普通字符串转换成16进制的字符串。
        /// </summary>
        /// <param name="_str">要转换的字符串。</param>
        /// <returns></returns>
        public static string StringToHex16String(string _str)
        {
            //将字符串转换成字节数组。
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(_str);
            //定义一个string类型的变量，用于存储转换后的值。
            string result = string.Empty;
            for (int i = 0; i < buffer.Length; i++)
            {
                //将每一个字节数组转换成16进制的字符串，以空格相隔开。
                result += Convert.ToString(buffer[i], 16) + " ";
            }
            return result;
        }
    }
}
